package com.stylefeng.guns.generator.engine.config;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.baomidou.mybatisplus.toolkit.IdWorker;
import com.stylefeng.guns.core.constant.IsMenu;
import com.stylefeng.guns.core.util.ToolUtil;

/**
 * 全局配置
 *
 * @author fengshuonan
 * @date 2017-05-08 20:21
 */
public class SqlConfig {

	private String sqlPathTemplate;

	private ContextConfig contextConfig;

	private Connection connection;

	private String parentMenuName;

	private List<Menu> menus = new ArrayList<>(6);

	public void init() {

		this.sqlPathTemplate = "\\src\\main\\java\\{}.sql";

		if (parentMenuName == null) {
			return;
		}

		// 根据父菜单查询数据库中的pcode和pcodes
		String[] pcodeAndPcodes = getPcodeAndPcodes();
		if (pcodeAndPcodes == null) {
			System.err.println("父级菜单名称输入有误!!!!");
			return;
		}

		// 业务菜单
		Menu menu = new Menu();
		menu.setId(IdWorker.getId());
		menu.setCode(contextConfig.getBizEnName());
		menu.setPcode(pcodeAndPcodes[0]);
		menu.setPcodes(pcodeAndPcodes[1] + "[" + pcodeAndPcodes[0] + "],");
		menu.setName(contextConfig.getBizChName());
		menu.setIcon("");
		menu.setUrl("/" + contextConfig.getBizEnName());
		menu.setNum(99);

		if (parentMenuName.equals("顶级")) {
			menu.setLevels(1);
		} else {
			menu.setLevels(2);
		}
		menu.setIsmenu(IsMenu.YES.getCode());
		menu.setStatus(1);
		menu.setIsopen(0);
		menus.add(menu);

		// 列表
		Menu list = createSubMenu(menu);
		list.setCode(contextConfig.getBizEnName() + "_list");
		list.setName(contextConfig.getBizChName() + "列表");
		list.setUrl("/" + contextConfig.getBizEnName() + "/list");
		menus.add(list);

		// 添加
		Menu add = createSubMenu(menu);
		add.setCode(contextConfig.getBizEnName() + "_add");
		add.setName(contextConfig.getBizChName() + "添加");
		add.setUrl("/" + contextConfig.getBizEnName() + "/add");
		menus.add(add);

		// 更新
		Menu update = createSubMenu(menu);
		update.setCode(contextConfig.getBizEnName() + "_update");
		update.setName(contextConfig.getBizChName() + "更新");
		update.setUrl("/" + contextConfig.getBizEnName() + "/update");
		menus.add(update);

		// 删除
		Menu delete = createSubMenu(menu);
		delete.setCode(contextConfig.getBizEnName() + "_delete");
		delete.setName(contextConfig.getBizChName() + "删除");
		delete.setUrl("/" + contextConfig.getBizEnName() + "/delete");
		menus.add(delete);

		// 详情
		Menu detail = createSubMenu(menu);
		detail.setCode(contextConfig.getBizEnName() + "_detail");
		detail.setName(contextConfig.getBizChName() + "详情");
		detail.setUrl("/" + contextConfig.getBizEnName() + "/detail");
		menus.add(detail);
	}

	private Menu createSubMenu(Menu parentMenu) {
		Menu menu = new Menu();
		menu.setId(IdWorker.getId());
		menu.setPcode(parentMenu.getCode());
		menu.setPcodes(parentMenu.getPcodes() + "[" + parentMenu.getCode() + "],");
		menu.setIcon("");
		menu.setNum(99);
		menu.setLevels(parentMenu.getLevels() + 1);
		menu.setIsmenu(IsMenu.NO.getCode());
		menu.setStatus(1);
		menu.setIsopen(0);
		return menu;
	}

	public String[] getPcodeAndPcodes() {
		if (parentMenuName.equals("顶级")) {
			return new String[] { "0", "" };
		}
		PreparedStatement preparedStatement = null;
		try {
			preparedStatement = connection.prepareStatement("select * from sys_menu where name like ?");
			preparedStatement.setString(1, "%" + parentMenuName + "%");
			ResultSet results = preparedStatement.executeQuery();
			while (results.next()) {
				String pcode = results.getString("code");
				String pcodes = results.getString("pcodes");
				if (ToolUtil.isNotEmpty(pcode) && ToolUtil.isNotEmpty(pcodes)) {
					String[] strings = { pcode, pcodes };
					return strings;
				} else {
					return null;
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			// 释放资源
			try {
				if (preparedStatement != null) {
					preparedStatement.close();
				}
				if (connection != null) {
					connection.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return null;
	}

	public ContextConfig getContextConfig() {
		return contextConfig;
	}

	public void setContextConfig(ContextConfig contextConfig) {
		this.contextConfig = contextConfig;
	}

	public String getParentMenuName() {
		return parentMenuName;
	}

	public void setParentMenuName(String parentMenuName) {
		this.parentMenuName = parentMenuName;
	}

	public Connection getConnection() {
		return connection;
	}

	public void setConnection(Connection connection) {
		this.connection = connection;
	}

	public String getSqlPathTemplate() {
		return sqlPathTemplate;
	}

	public void setSqlPathTemplate(String sqlPathTemplate) {
		this.sqlPathTemplate = sqlPathTemplate;
	}

	public List<Menu> getMenus() {
		return menus;
	}

	public void setMenus(List<Menu> menus) {
		this.menus = menus;
	}
}
